// Node.js Buffer(缓冲区)
/*
* JavaScript 语言自身只有字符串数据类型，没有二进制数据类型。
但在处理像TCP流或文件流时，必须使用到二进制数据。因此在 Node.js中，
定义了一个 Buffer 类，该类用来创建一个专门存放二进制数据的缓存区。

在NodeJS中，进行http传输时，若返回的类型为string，
则会将string类型的参数，转换为Buffer，通过NodeJS中的Stream流，一点点的返回给客户端。
如果我们直接返回Buffer类型，就没有了转换操作，直接返回，减少了CPU的重复使用率。
* */

const buf = Buffer.from('runoob', 'ascii');

// 支持的字符编码ascii ,utf8, utf16le, base64 ,hex(每个字节编码为两个十六进制字符)
console.log(buf.toString('hex'));
console.log(buf.toString('base64'));


//----------------------------------------------------------------------
// 创建 Buffer 类
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);  // <Buffer 00 00 00 00 00 00 00 00 00 00>

// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1); // <Buffer 01 01 01 01 01 01 01 01 01 01>
console.log(buf2);


/*
* 创建一个长度为 10、且未初始化的 Buffer。
* 这个方法比调用 Buffer.alloc() 更快，
* 但返回的 Buffer 实例可能包含旧数据，
* 因此需要使用 fill() 或 write() 重写。
* */

const buf3 = Buffer.allocUnsafe(11);

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([18]); // 12
const buf5 = Buffer.from('18'); // <Buffer 31 38>
console.log(buf5)


// -----------------------------------------------------------
// 写入缓冲区
// 返回实际写入的大小。如果 buffer 空间不足， 则只会写入部分字符串。
const buf7 = Buffer.alloc(265)
let len = buf7.write("welcome to mianyang!!!")
console.log("写入字节数 : " + len)

// 缓冲区读取数据
const buf8 = Buffer.alloc(26);
for (let i = 0 ; i < 26 ; i++) {
    buf8[i] = i + 97;
}
console.log( buf8.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf8.toString('ascii',0,5));   // 输出: abcde
console.log( buf8.toString('utf8',0,5));    // 输出: abcde
console.log( buf8.toString(undefined));     // 使用 'utf8' 编码, 并输出: abcdefghijklmnopqrstuvwxyz


// 将 Buffer 转换为 JSON 对象
const buf9 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf9);
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);


// parse中的函数会对每个键和每个值进行循环！！！
const cop = JSON.parse(json, (key ,value) => {
    return value && value.type === 'Buffer' ?
        Buffer.from(value.data) : value
});

console.log(cop); // <Buffer 01 02 03 04 05>

//缓冲区合并

let buffer1 = Buffer.from(('菜鸟教程'));
let buffer2 = Buffer.from(('www.runoob.com'));
let buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3内容:  " + buffer3.toString());

// 拷贝缓冲区
let buf10 = Buffer.from('abcdefghijkl');
let buf11 = Buffer.from('RUNOOB');

//将 buf11 插入到 buf10 指定位置上,并把位置占了
buf11.copy(buf10, 2);
console.log(buf10.toString());

// 缓冲区长度
let buf13 = Buffer.from('www.runoob.com');
//  缓冲区长度
console.log("buffer length: " + buf13.length);


// 缓冲区裁剪

let buffer14 = Buffer.from('runoob');
// 剪切缓冲区
let buffer15 = buffer14.slice(0,2);
console.log("buffer2 content: " + buffer15.toString());
